package com.xhsj.user.pms.patent.mapper;


import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xhsj.user.pms.overseas.dto.GmMonitorListAduitDto;
import com.xhsj.user.pms.overseas.entity.TbPamOverseasPrompt;
import com.xhsj.user.pms.patent.domain.Disclosure;
import com.xhsj.user.pms.patent.domain.IprWorkLoad;
import com.xhsj.user.pms.patent.dto.PatentByArchivesNumDto;
import com.xhsj.user.pms.patent.dto.PatentByModelTypeDto;
import com.xhsj.user.pms.patent.query.TransferPCTOrPRCDataQuery;
import com.xhsj.user.pms.workflow.model.RuningTaskModel;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

@Mapper
public interface DisclosureMapper extends BaseMapper<Disclosure> {

    /**
     * 查询我的专利列表
     * @param
     * @return
     */
    IPage<Disclosure> selectMyPatentList(IPage page, @Param("userId") Long userId, @Param("name") String name, @Param("inventor") String inventor,
                                         @Param("fullName") String fullName, @Param("deptName") String deptName, @Param("archivesNum") String archivesNum,
                                         @Param("isProcessSpecialist") boolean isProcessSpecialist, @Param("frozenButton") boolean frozenButton
    );

    /**
     * 查询交底书编号是否存在
     * @param num
     * @return
     */
    Integer getNumCount(@Param("num") String num);

    /**
     * 查询最新编号
     * @return
     */
    String getNewNum();

    /**
     * 通过主键ID查询交底书
     * @param disclosureId
     * @return
     */
    Disclosure getDisclosureByDisclosureId(@Param("disclosureId") String disclosureId);

    /**
     * 获取部门集合
     * @return
     */
    List<Map<String, Object>> getDeptAll();

    //    技术交底书
    List<Map<String, Object>> getTechnologyDisclosure(@Param("disclosureId") String disclosureId);

    // 通过用户id查询部门信息
    Map<String, Object> getDeptByUserId(@Param("userId") Long userId);

    // 根据状态id 查询专利
    List<Disclosure> getDisclosureByStatusId(@Param("statusId") String statusId);

    // ipr技术方案编写 查询交底书详细信息
    Map<String, Object> getDisclosureDetailPlanToWrite(@Param("disclosureId") String disclosureId);

    /**
     * 选择意见列表
     * @author 苏小林
     * @date 2020/2/26 13:52
     * @param: disclosureId
     * @return: java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     */
    List<Map<String, Object>> selectOpinion(@Param("disclosureId") String disclosureId);

    /**
     * 获取提交记录前查询专利数据
     * @author 苏小林
     * @date 2020/2/27 10:20
     * @param: disclosureId
     * @return: java.util.Map<java.lang.String,java.lang.Object>
     */
    Map<String, Object> getBeforeSubmitRecordData(@Param("disclosureId") String disclosureId);
//当前用户所有的交底书文件
    List<Map<String, Object>> getTechnologyDisclosureByUserId(@Param("disclosureId") String disclosureId, @Param("userId") String userId);

    // 根据月获取数据
    List<Map<String, Object>> getNumByMonth(@Param("typeParam") String typeParam);
    //    数据按季度
    List<Map<String, Object>> getNumByQuarter(@Param("typeParam") String typeParam);
    //    数据按年份
    List<Map<String, Object>>  getNumByYear(@Param("typeParam") String typeParam);

    //    交底书所有数据总数
    int getDisclosureTotal();

//    数据按月度授权通过
       Map<String, Object> getNumMapByAuthorizedPassMonth(@Param("typeParam") String typeParam);
//    数据按季度授权通过
      Map<String, Object> getNumMapByAuthorizedPassQuarter(@Param("typeParam") String typeParam);
//    数据按年授权通过
      Map<String, Object> getNumMapByAuthorizedPassYear(@Param("typeParam") String typeParam);


    int disclosureTotalByType(@Param("type")String type,
                              @Param("typeParam")String typeParam,
                              @Param("typeKinds")String typeKinds,
                              @Param("nodeList")List<String> nodeList);

    //报表饼状图
    List<Map<String, Object>> getPieNumData(@Param("startTime") Object startTime,
                                            @Param("endTime") Object endTime,
                                            @Param("nodeList") List<String> nodeList);

    // 数据授权通过
    Map<String, Object> getNumMapByAuthorizedPass(@Param("startTime") Object startTime, @Param("endTime") Object endTime);
    //报表饼状图通过状态
    List<Map<String, Object>> getPieNumDataByPhaseStatus(@Param("startTime") Object startTime,
                                                         @Param("endTime") Object endTime,
                                                         @Param("phaseStatusList") List<Integer> phaseStatusList,
                                                         @Param("nodeList1") List<String> nodeList1);

    //报表饼状图
    List<Map<String, Object>> getPieNumDataByRunExec(@Param("startTime") Object startTime,
                                                     @Param("endTime") Object endTime);

    List<IprWorkLoad> getIprWorkload();

    // 查询专利部门所有工作量
    int getAllWorkload();

    // 获取ipr人员列表
    List<Map<String,Object>> getIprNumber();

    // 报表柱状重要与不重要个人
    List<Map<String, Object>> getNumDataByUserBySignificanceIdentify(@Param("type") int type,
                                                                     @Param("typeParam") String typeParam,
                                                                     @Param("nodeIdList") List<String> nodeIdList);
    // 交底书报表柱状重要与不重要个人
    List<Map<String, Object>> getNumDataByDisclosureSignificanceIdentify(@Param("type") int type,
                                                                         @Param("typeParam") String typeParam,
                                                                         @Param("nodeIdList") List<String> nodeIdList);

    // 报表二级柱状图个人交底书
    List<Map<String, Object>> getNumByDisclosureByUserId(@Param("type") int type,
                                                         @Param("userId")String userId,
                                                         @Param("nodeIdList") List<String> nodeIdList);

    // 报表二级柱状图个人
    List<Map<String, Object>> getNumByUserId(@Param("type") int type,
                                             @Param("userId")String userId,
                                             @Param("nodeIdList") List<String> nodeIdList);
    /**
     * 查询交底书相关评审会负责人
     * @author 苏小林
     * @date 2021/1/12 11:26
     * @param: disclosureId
     * @return: java.util.List<java.lang.Long>
     */
    List<Long> getPatentUserIdByDisclosureId(@Param("disclosureId") String disclosureId);

    /**
     * 删除交底书和相关流程
     * @author 苏小林
     * @date 2021/1/14 13:46
     * @param: disclosureId
     */
    void delDisclosureAndProcess(@Param("disclosureId") String disclosureId);


    // 判断是否有关联的交底书
    int getRelationDisclosure(@Param("id") String id);
    // 查询是否有当前节点在评审会初审和终审以及评审会初审和终审确认
    List<RuningTaskModel> getRuningTask(@Param("id")String id);

    // 查询技术领域 节点为评审会初审和评审会终审以及初审确认和终审确认
    List<RuningTaskModel> getRuningTaskById(@Param("disclosureId") String disclosureId,@Param("id")String id);

    List<TransferPCTOrPRCDataQuery> getTransferPCTOrPRCData();

    IPage<Map<String, Object>> getPatentByArchivesNum(Page<Map<String, Object>> page, @Param("param") PatentByArchivesNumDto param);

    /**
     * @Description:  OA答复模块-通过模块类型搜索
     * @Author: liuqinghua
     * @Date: 2021/8/4
     */
    List<Map<String,String>> getPatentByModelType(@Param("processType") String processType,
                                @Param("tableName") String tableName,
                                @Param("param") PatentByModelTypeDto param);

    /**
     * @Description: 专利统计-国内专利已完成
     * @Param:  date 日期
     * @Author: liuqinghua
     * @Date: 2021/9/6
     */
    Integer getPatentComplete(@Param("date") String date,@Param("isNow")boolean isNow);

    //  通过案卷号获取数据
    GmMonitorListAduitDto getDisclosureByArchivesNum(@Param("archivesNum") String archivesNum);

    void deleteByDisclosureId(@Param("disclosureId")  String disclosureId);

    // 修改案件等级
    int updateSignificanceIdentify(@Param("disclosureId") String disclosureId, @Param("significanceIdentify") Integer significanceIdentify);
}